/**
 * @author 甜圆
 * @version v1.0.1
 * @date 2025/8/25 16:16
 * @package PACKAGE_NAME
 * @copyright 甜圆
 */

/**
 * (1)	搭建一个多线程服务器，端口为8989，要求如下
 * ①	接收客户端发送的聊天信息并显示
 * ②	如果收到的是quit，则结束读取，关闭服务器
 * ③	服务器将收取的字符串进行反转，再返回给客户端
 * (2)	搭建一个客户端，要求如下:
 * ①	接收键盘录入信息然后发给服务器
 * ②	如果录入的字符串是quit，则发送后结束录入，关闭客户端
 * ③	客户端收取服务器返回的数据并输出显式
 * 功能实现以后，启动服务器，然后同时启动多个客户端测试上述功能
 */
import java.io.*;
import java.net.*;

public class MultiThreadServer {
    private static ServerSocket serverSocket;
    private static boolean isRunning = true;

    public static void main(String[] args) {
        try {
            // 创建服务器套接字，监听8989端口
            serverSocket = new ServerSocket(8989);
            System.out.println("服务器已启动，监听端口8989...");

            while (isRunning) {
                // 等待客户端连接
                Socket clientSocket = serverSocket.accept();
                System.out.println("新客户端连接: " + clientSocket.getInetAddress().getHostAddress());

                // 为每个客户端创建一个新线程处理通信
                Thread clientHandler = new Thread(new ClientHandler(clientSocket));
                clientHandler.start();
            }

            serverSocket.close();
        } catch (IOException e) {
            if (!isRunning) {
                System.out.println("服务器已关闭");
            } else {
                e.printStackTrace();
            }
        }
    }

    // 关闭服务器的方法
    public static void stopServer() {
        isRunning = false;
        try {
            if (serverSocket != null && !serverSocket.isClosed()) {
                serverSocket.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 处理客户端通信的内部类
    static class ClientHandler implements Runnable {
        private Socket clientSocket;
        private BufferedReader in;
        private PrintWriter out;

        public ClientHandler(Socket socket) {
            this.clientSocket = socket;
        }

        public void run() {
            try {
                // 获取输入输出流
                in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
                out = new PrintWriter(clientSocket.getOutputStream(), true);

                String inputLine;
                // 读取客户端发送的信息
                while ((inputLine = in.readLine()) != null) {
                    System.out.println("收到来自" + clientSocket.getInetAddress().getHostAddress() + "的消息: " + inputLine);

                    // 如果收到quit，关闭连接，如果是服务器端收到quit则关闭服务器
                    if ("quit".equalsIgnoreCase(inputLine)) {
                        out.println("服务器已收到关闭请求");
                        System.out.println("客户端" + clientSocket.getInetAddress().getHostAddress() + "请求断开连接");
                        break;
                    }

                    // 反转字符串并返回给客户端
                    String reversed = new StringBuilder(inputLine).reverse().toString();
                    out.println("服务器返回: " + reversed);
                }

                // 关闭资源
                in.close();
                out.close();
                clientSocket.close();
                System.out.println("客户端" + clientSocket.getInetAddress().getHostAddress() + "已断开连接");

            } catch (IOException e) {
                System.out.println("与客户端" + clientSocket.getInetAddress().getHostAddress() + "的连接发生错误: " + e.getMessage());
            }
        }
    }
}

